// 写业务逻辑
const User = require("../models/User")
const jwt = require("jsonwebtoken")
const bcrypt = require('bcrypt')
const { logger } = require('../config/logConfig')
const { redisCreateClient } = require('../config/redis')

// 注册
async function register (req, res) {
  const { username, password, mbl } = req.body
  const randomNum = Math.floor(Math.random() * 1000000).toString().padStart(6, '0')
  const id = `831${ randomNum }`
  try {
    const existingUser = await User.findOne({ where: { id } })
    if (existingUser) {
      return res.status(200).json({ msg: `注册失败`, code: 400 })
    }
    const hashedPassword = await bcrypt.hash(password, 10)
    // 创建新用户
    await User.create({ id, username, password: hashedPassword, mbl })
    res.status(200).json({ msg: '用户注册成功', code: 0 })
  } catch (error) {
    logger.error(error)
    res.status(500).json({ msg: '注册用户失败', code: 400 })
  }
}

/**
 * 登录流程: 1:看用户是否存在 2.看密码是否匹配 3.创建token 下发用户信息和token
 * @param {*} req 
 * @param {*} res 
 */

async function login (req, res) {
  const { username, password } = req.body

  try {
    const user = await User.findOne({ where: { username } })

    if (!user) {
      return res.status(401).json({ msg: '用户名或密码无效', code: 200 })
    }

    // 检查密码
    const isPasswordMatch = await bcrypt.compare(password, user.password)

    if (!isPasswordMatch) {
      return res.status(401).json({ msg: '密码错误！', code: 200 })
    }

    // 创建访问令牌
    const token = jwt.sign({ userId: user.id }, 'xxx-your-secret-key')

    // 将 token 存储到 Redis 中，设置有效期为 30 分钟
    const redisClient = await redisCreateClient({ host: '127.0.0.1', port: 6379, db: 0 })
    redisClient.set('token', token)
    redisClient.EXPIRE('token', 1800)

    // 返回包含令牌以及用户信息
    let data = { token, regId: user.username, mbl: user.mbl, id: user.id }
    res.json({ msg: 'OK', data, code: 200 })
  } catch (error) {
    logger.error(error)
    res.status(500).json({ msg: '登录失败', code: 400 })
  }
}
module.exports = { register, login }
